#include <mips/regdef.h>
#include <sys/syscall.h>
#define stdinfd 	0
#define stdoutfd 	1
#ifndef 	fp
#define	fp	$fp
#endif
#define CARGA_SSIZE		(64)
#define	CARGA_RA		(56)
#define	CARGA_FP		(52)
#define	CARGA_GP		(48)
#define CARGA_S5		(40)
#define CARGA_S4		(36)
#define CARGA_S3		(32)
#define CARGA_S2		(28)
#define CARGA_S1		(24)
#define CARGA_S0		(20)
#define CARGA_ARG0		(CARGA_SSIZE)
#define CARGA_ARG1		((CARGA_SSIZE)+4)
#	a0 puntero a la variable que contendrá dirección vector
#	a1 puntero a variable que indica el tamaño del vector
	.text
	.align 	2
	.globl	cargarDatos
	.ent	cargarDatos
cargarDatos:
   	.frame fp,CARGA_SSIZE,ra
   	.set  noreorder
   	.cpload  t9
   	.set  reorder
	subu	sp,sp,CARGA_SSIZE
	.cprestore 16
	sw		s4,CARGA_S4(sp)
	sw		s3,CARGA_S3(sp)
	sw		s2,CARGA_S2(sp)
	sw		s1,CARGA_S1(sp)
	sw		s0,CARGA_S0(sp)
	sw		ra,CARGA_RA(sp)
	sw		fp,CARGA_FP(sp)
	sw		gp,CARGA_GP(sp)
	move	fp,sp
	sw		a0,CARGA_ARG0(fp)
	sw		a1,CARGA_ARG1(fp)
	lw		a0,CARGA_ARG0(fp)
	lw		a1,CARGA_ARG1(fp)
	#s0: cantidad de elementos cargados en bytes
	#s1: auxiliar
	#s2: raiz vector salida
	#s3: tamanio máximo vector en bytes
	#s4: puntero a la variable que contiene la cantidad de elementos
	#	almacenados
	addu 	s0,zero,0
	addu	s4,a1,zero
	#reserva de memoria inicial
	lw		a0,tamanio_inicial_vector
	lw		s3,tamanio_inicial_vector
	la      t9,mymalloc
    jal     ra,t9
    beq		v0,zero,fin_cargarDatos
	#carga de vector y tamaño en parámetros
    addu	s2,zero,v0
    lw		t0,CARGA_ARG0(fp)
    sw		s2,0(t0)
   	sw 		zero,0(s4)
loop:
	li		a0,stdinfd
	la		a1,caracter
	li		a2,1
	la		t9,leer
	jal		ra,t9
	#verificación de caracter leído
	beq		v0,zero,fin_cargarDatos
	#verificación espacio suficiente
	blt		s0,s3,cargar_caracter
reserva_mas_memoria:
	#calculo tamaño nuevo
	sll		s5,s3,1
	addiu	s5,s5,1
	ble		s5,s3,fin_cargarDatos
	addu	a0,s2,zero
	addu	a1,s0,zero
	addu	a2,zero,s5
	la		t9,realloc
	jal		t9
	#verifico que el nuevo vector es no nulo
	beq		v0,zero,fin_cargarDatos
	#carga de vector
    addu	s2,zero,v0
    lw		t0,CARGA_ARG0(fp)
    sw		s2,0(t0)
	#actualizo tamaño máximo
	addu	s3,s5,zero
cargar_caracter:
	addu	t0,s2,s0
	lb		t1,caracter
	sb		t1,0(t0)
	addiu	s0,s0,1
	sw		s0,0(s4)
	b		loop
fin_cargarDatos:
	move	sp,fp		# destruyo stack frame
	lw		s0,CARGA_S0(sp)
	lw		s1,CARGA_S1(sp)
	lw		s2,CARGA_S2(sp)
	lw		s3,CARGA_S3(sp)
	lw		s4,CARGA_S4(sp)
	lw		gp,CARGA_GP(sp)
	lw		fp,CARGA_FP(sp)
	lw		ra,CARGA_RA(sp)
	addiu	sp,sp,CARGA_SSIZE
	j		ra
	.end	cargarDatos
.data
caracter: .byte 0
tamanio_inicial_vector: .word 0xFF
memoria:  .asciiz "memoria\n"
